package dao

import (
	"context"
	"errors"

	"192.168.1.75/go-pkg/helper"
	"192.168.1.75/go-pkg/logx"
	"gorm.io/gen/field"
	"gorm.io/gorm/clause"

	"gorm.io/gorm"
	//"mini-app/config/mysql"
	"mini-app/internal/dal"
	"mini-app/internal/models"
)

type GoodsSettingRepo struct {
	query *dal.Query
}

func NewGoodsSettingRepo(in any) *GoodsSettingRepo {
	return &GoodsSettingRepo{query: getCommonQuery(in)}
}

func (p GoodsSettingRepo) fmtFilter(ctx context.Context, f IGoodsSettingFilter) dal.IGoodsSettingDo {
	tx := p.query.GoodsSetting.WithContext(ctx)
	tx = f.fmtFilter(ctx, tx, p.query)
	return tx
}

// 查询
//func (p GoodsSettingRepo) FindOneByGoodsIDandGoodsID(ctx context.Context, id int64) (*models.GoodsSetting, error) {
//	rc, err := p.query.GoodsSetting.WithContext(ctx).Where(p.query.GoodsSetting.ID.Eq(id)).First()
//	if err != nil {
//		if errors.Is(err, gorm.ErrRecordNotFound) {
//			return nil, nil
//		}
//
//		logx.Error(ctx, "GoodsSetting.FindOneByFilter", logx.Any("err", err))
//		return nil, errors.Join(errors.New("查询失败"), err)
//	}
//
//	return rc, nil
//}

func (p GoodsSettingRepo) FindOneByFilter(ctx context.Context, f IGoodsSettingFilter) (*models.GoodsSetting, error) {
	tx := p.fmtFilter(ctx, f)

	rc, err := tx.First()
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, nil
		}

		logx.Error(ctx, "GoodsSetting.FindOneByFilter", logx.Any("err", err))
		return nil, errors.Join(errors.New("查询失败"), err)
	}

	return rc, nil
}

// 更新  因为老表没有ID字段
//
//func (p GoodsSettingRepo) UpdateById(ctx context.Context, data *models.GoodsSetting) error {
//	if data.ID <= 0 {
//		return errors.New("id不能为0")
//	}
//
//	_, err := p.query.GoodsSetting.WithContext(ctx).Where(p.query.GoodsSetting.ID.Eq(data.ID)).Updates(data)
//	return err
//}
//
//func (p GoodsSettingRepo) UpdateColById(ctx context.Context, data *models.GoodsSetting, columns ...field.Expr) error {
//	if data.ID <= 0 {
//		return errors.New("id不能为0")
//	}
//
//	_, err := p.query.GoodsSetting.WithContext(ctx).Select(columns...).Where(p.query.GoodsSetting.ID.Eq(data.ID)).Updates(data)
//	return err
//}

// 通过筛选器进行更新，但是建议都用id方式进行update
func (p GoodsSettingRepo) UpdateByFilter(ctx context.Context, f IGoodsSettingFilter, data *models.GoodsSetting) error {
	tx := p.fmtFilter(ctx, f)
	_, err := tx.Updates(data)
	return err
}

/* 例子
// 只更新 NickName 和 Gender 字段，即使其他字段有值也不更新
repo.UpdateColByFilter(ctx, filter, &models.GoodsSetting{
    NickName: "新昵称",
    Gender: 1,
    WinCount: 100, // 这个字段不会被更新
},
p.query.GoodsSetting.NickName,  // 强类型字段
p.query.GoodsSetting.Gender,    // 强类型字段
)
*/
// 只更新指定列
func (p GoodsSettingRepo) UpdateColByFilter(ctx context.Context, f IGoodsSettingFilter, data *models.GoodsSetting, columns ...field.Expr) error {
	tx := p.fmtFilter(ctx, f)
	_, err := tx.Select(columns...).Updates(data)
	return err
}

/*
// UpdateAssignByFilter - 直接赋值更新
repo.UpdateAssignByFilter(ctx, filter,
    p.query.GoodsSetting.NickName.Value("新昵称"),
    p.query.GoodsSetting.Gender.Value(0), // 支持零值
)
*/
// 指定列0值也会更新，未指定列非0值也会更新
func (p GoodsSettingRepo) UpdateAssignByFilter(ctx context.Context, f IGoodsSettingFilter, assigns ...field.AssignExpr) error {
	tx := p.fmtFilter(ctx, f)
	_, err := tx.UpdateSimple(assigns...)
	return err
}

// 增加
func (p GoodsSettingRepo) Insert(ctx context.Context, data *models.GoodsSetting) error {
	//if data.ID == 0 {
	//    data.ID, _ = helper.UUID{}.Int64()
	//}
	return p.query.GoodsSetting.WithContext(ctx).Create(data)
}

func (p GoodsSettingRepo) MultiInsert(ctx context.Context, data []*models.GoodsSetting) error {
	//for _, v := range data {
	//    if v.ID == 0 {
	//        v.ID, _ = helper.UUID{}.Int64()
	//    }
	//}
	return p.query.GoodsSetting.WithContext(ctx).Clauses(clause.OnConflict{UpdateAll: true}).Create(data...)
}

// 删除
func (p GoodsSettingRepo) DeleteByFilter(ctx context.Context, f IGoodsSettingFilter) error {
	tx := p.fmtFilter(ctx, f)
	_, err := tx.Delete()
	return err
}

//func (p GoodsSettingRepo) DeleteById(ctx context.Context, id int64) error {
//	if id <= 0 {
//		return errors.New("id不能为0")
//	}
//
//	assign := p.query.GoodsSetting.Deleted.Value(true)
//	_, err := p.query.GoodsSetting.WithContext(ctx).Where(p.query.GoodsSetting.ID.Eq(id)).UpdateSimple(assign)
//	if err != nil {
//		if errors.Is(err, gorm.ErrRecordNotFound) {
//			return nil
//		}
//
//		logx.Error(ctx, "GoodsSettingRepo.DeleteById", logx.Any("err", err))
//		return err
//	}
//	//_, err := p.query.GoodsSetting.WithContext(ctx).Where(p.query.GoodsSetting.ID.Eq(id)).Delete()
//	return err
//}

// 列表

//func (p GoodsSettingRepo) FindByFilter(ctx context.Context, f *GoodsSettingFilter, page *helper.PageInfo) ([]*models.GoodsSetting, error) {
//	tx := p.fmtFilter(ctx, f)
//	result, _, err := tx.FindByPage(int(page.GetOffset()), int(page.GetLimit()))
//	return result, err
//}

func (p GoodsSettingRepo) ListByFilter(ctx context.Context, f IGoodsSettingFilter, page *helper.PageInfo) ([]*models.GoodsSetting, int64, error) {
	list, count, err := p.fmtFilter(ctx, f).FindByPage(int(page.GetOffset()), int(page.GetLimit()))
	return list, count, err
}

// 未提供exsit函数，使用Count函数判断返回个数来达到同样目的
func (p GoodsSettingRepo) CountByFilter(ctx context.Context, f IGoodsSettingFilter) (int64, error) {
	tx := p.fmtFilter(ctx, f)
	return tx.Count()
}

// 强类型 JOIN 查询结果结构体
/*
type GoodsSettingWithJoin struct {
	GoodsSetting models.GoodsSetting `gorm:"embedded"`
    GoodsSetting models.GoodsSetting       `gorm:"embedded"` // 开发人员根据具体需求替换 JoinTable
}

// 强类型 JOIN 查询 - 通过筛选器进行分页查询
func (p GoodsSettingRepo) ListJoinByFilter(ctx context.Context, f IGoodsSettingJoinFilter, page *helper.PageInfo) ([]*GoodsSettingWithJoin, int64, error) {
	// 获取强类型查询对象
	main := p.query.GoodsSetting
	join := p.query.GoodsSetting // 开发人员根据具体需求替换 JoinTable

	// 应用筛选条件
	tx := f.fmtJoinFilter(ctx, main, join, p.query)

	// 执行强类型 JOIN 查询并分页
	var results []*GoodsSettingWithJoin
	err := tx.Select(main.ALL, join.ALL).
		Offset(int(page.GetOffset())).
		Limit(int(page.GetLimit())).
		Scan(&results)

	if err != nil {
		logx.Error(ctx, "GoodsSetting.ListJoinByFilter", logx.Any("err", err))
		return nil, 0, errors.Join(errors.New("JOIN查询失败"), err)
	}

	// 获取总数
	var count int64
	countTx := f.fmtJoinFilter(ctx, main, join, p.query)
	count, err = countTx.Count()
	if err != nil {
		logx.Error(ctx, "GoodsSetting.ListJoinByFilter.Count", logx.Any("err", err))
		return results, 0, errors.Join(errors.New("JOIN查询计数失败"), err)
	}

	return results, count, nil
}
*/
